import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_first_one/util/config.dart';

class ImageAnimation extends StatefulWidget {
  final double width;
  const ImageAnimation({super.key, this.width = 180});

  @override
  // ignore: library_private_types_in_public_api
  _ImageAnimationState createState() => _ImageAnimationState();
}

class _ImageAnimationState extends State<ImageAnimation>
    with TickerProviderStateMixin {
  int _currentIndex = 0;
  List<dynamic> _images = [];
  Timer? _timer;

  // late AnimationController _controller;

  Future<bool> getImages() async {
    // 获取图片的逻辑
    const String imgDir = '1';
    for (var i = 1; i < 60; i++) {
      String imgUrl =
          '${FileConfig.fileDomain}/static/mascot/$imgDir/animation_($i).png';
      setState(() {
        _images.add(imgUrl);
      });
    }
    return true;
  }

  // 使用precacheImage预加载图片
  Future<bool> precacheImages() async {
    const String imgDir = '1';
    // 放一个存储异步函数（类型promise）的列表
    List<Future<void>> list = [];
    for (var i = 1; i < 60; i++) {
      String imgUrl =
          '${FileConfig.fileDomain}/static/mascot/$imgDir/animation_($i).png';
      // 使用precacheImage函数预加载图片
      list.add(precacheImage(NetworkImage(imgUrl), context));
    }
    // Future.wait类似Promise.all，放异步数组，所有都成功才会往下执行
    await Future.wait(list);
    return true;
  }

  void _updateIndex() {
    _timer = Timer.periodic(Duration(milliseconds: 30), (Timer timer) {
      setState(() {
        _currentIndex =
            _currentIndex >= _images.length - 1 ? 0 : _currentIndex + 1;
      });
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print('小虎哥动画初始化');
    getImages();
    // 在widget构建完成后执行（content已获得）
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      // 先缓存图片（须在获取到content才能调用）
      await precacheImages();
      // 缓存结束再调用，解决图片闪烁问题
      _updateIndex();
    });

    // _controller = AnimationController(
    //   vsync: this,
    //   duration: Duration(seconds: 1),
    //   lowerBound: 0.0,
    //   upperBound: 60.0,
    // );
    // _controller.addListener(() {
    //   setState(() {
    //     // currentIndex = (_controller.value * images.length).floor() % images.length;
    //     print(_controller.value);
    //   });
    // });
  }

  // 定时器销毁
  @override
  void dispose() {
    _timer?.cancel(); // 取消定时器
    print('小虎哥销毁');
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Image.network(
      _images[_currentIndex],
      // 防止图片闪烁
      gaplessPlayback: true,

      key: ValueKey(_images[_currentIndex]),
      width: widget.width,
      fit: BoxFit.fitWidth,
    );
  }
}
